package com.hero.power.controller;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hero.power.common.Result;
import com.hero.power.entity.Site;
import com.hero.power.service.ISiteService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.List;


@RestController
@RequestMapping("/site")
public class SiteController {

    @Resource
    private ISiteService iSiteService;

    /**
     * yml配置文件中的文件上传路径
     */
    @Value("${files.upload.path}")
    private String fileUploadPath;

    /**
     * yml配置文件中的服务端口
     */
    @Value("${server.ip}")
    private String serverIp;


    /**
     * 根据ID查询站点信息
     * @param id 主键
     * @return
     */
    @GetMapping("/get/{id}")
    public Site getSite(@PathVariable("id") Integer id) {
        return iSiteService.getById(id);
    }

    /**
     * 查询站点列表
     * @param pageNo 页码
     * @param pageSize 一页多少条
     * @param userId 用户ID
     * @param role 权限
     * @param name 站点名称
     * @return
     */
    @GetMapping("/getList")
    @ResponseBody
    public Page<Site> getSiteList(@RequestParam(required = false, defaultValue = "1") Integer pageNo,
                                  @RequestParam(required = false, defaultValue = "10") Integer pageSize,
                                  @RequestParam Integer userId,
                                  @RequestParam String role,
                                  @RequestParam(required = false, defaultValue = "") String name) {
        return iSiteService.getSiteList(pageNo, pageSize, userId, role, name);
    }


    /**
     * 新增或更新
     * @param site 站点实体
     * @return
     */
    @PostMapping("/saveOrUpdate")
    public Result saveOrUpdateSite(@RequestBody Site site) {
        if (!iSiteService.saveOrUpdate(site)) {
            return Result.error();
        }
        return Result.success();
    }


    /**
     * 上传文件
     * @param file 文件
     * @param id 主键
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public String upload(@RequestParam(value = "file") MultipartFile file,@RequestParam(value = "id") String id) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String type = FileUtil.extName(originalFilename);

        // 定义一个文件唯一的标识码
        String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type;
        String url = "http://" + serverIp + ":9090/file/" + fileUUID; ;
        File uploadFile = new File(fileUploadPath + fileUUID);
        // 判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
        File parentFile = uploadFile.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }
        // 判断文件是否已经存在
        if(!uploadFile.exists()){
            // 上传文件到磁盘
            file.transferTo(uploadFile);
        }
        // 更新数据库
        Site site = new Site();
        site.setId(Integer.parseInt(id));
        site.setAvatarUrl(url);
        iSiteService.saveOrUpdate(site);
        return url;
    }


    /**
     * 根据主键ID删除
     * @param id 主键ID
     * @return
     */
    @PostMapping("/delete/{id}")
    public Result deleteSite(@PathVariable("id") Integer id) {
        if (!iSiteService.removeById(id)) {
            return Result.error();
        }
        return Result.success();
    }

    /**
     * 根据主键集合批量删除
     * @param ids 主键集合
     * @return
     */
    @PostMapping("/del/batch")
    public Result deleteBatch(@RequestBody List<Integer> ids) {
        iSiteService.removeByIds(ids);
        return Result.success();
    }

}
